package com.cw.lang.common.framework.enums;

import java.util.Arrays;

import lombok.Getter;

/**
 * @author chenw
 * @version $$Id: EnumRpcError.java, v 0.1 2018/9/21 上午9:54 chenw Exp $$
 */
@Getter
public enum EnumRpcError {
    /** 请求模块不可为未知 */
    ASK_CAN_NOT_BE_UNKNOWN("RPC000001", "请求模块不可为未知"),
    /** 响应模块不可为未知 */
    ANSWER_CAN_NOT_BE_UNKNOWN("RPC000002", "响应模块不可为未知"),
    /** 服务场景不可为未知 */
    SERVICE_SCENE_CAN_NOT_BE_UNKNOWN("RPC000003", "服务场景不可为未知"),
    /** 缓存组件未做配置 */
    CACHE_NOT_CONFIGURATION("RPC000004", "缓存组件未做配置"),
    /** 被注解的参数不能超过一定数量 */
    TRADE_ID_CAN_NOT_BE_NULL("RPC000005", "被[{}]注解的参数不能超过[{}]个"),
    /** 交易流水号仅支持String类型 */
    IDEM_SERIAL_NO_NOT_SUPPORT_CLASS("RPC000006", "交易流水号仅支持[{}]类型，当前类型为[{}]"),
    /** rpc超时 */
    RPC_TIME_OUT("RPC000007", "rpc超时"),
    /** 幂等校验失败 */
    IDEMPOTENT_ERROR("RPC000008", "幂等校验失败"),
    /** 系统异常 */
    SYSTEM_ERROR("RPC000009", "系统异常"),
    /** 校验异常 */
    VALIDATOR_ERROR("RPC000010", "参数不符: {}"),
    /** BaseRequest不可为空 */
    BASE_REQUEST_CAN_NOT_BE_NULL("RPC000011", "BaseRequest不可为空"),
    /** 获取response中的writer报错 */
    GET_RESPONSE_ERROR("RPC000012", "获取response中的writer报错"),
    /** header参数编码异常 */
    HEADER_PARAM_CODEC_ERR("RPC000013", "header参数编码异常"),
    /** 设置的幂等流水号参数无法没spel解析 */
    IDEM_SERIAL_NO_NOT_SUPPORT("RPC000014", "设置的幂等流水号参数无法被spel解析"),
    ;

    /** 码 */
    private final String code;

    /** 描述 */
    private final String description;

    EnumRpcError(String code, String description) {
        this.code = code;
        this.description = description;
    }

    /**
     * 根据code查找枚举
     *
     * @param code code
     * @return 枚举
     */
    public static EnumRpcError find(String code) {
        return Arrays.stream(EnumRpcError.values())
            .filter(input -> input.getCode()
                .equals(code))
            .findFirst()
            .orElse(null);
    }
}
